package com.example.demo;

import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import org.springframework.web.bind.annotation.*;

import java.util.Arrays;
import java.util.Enumeration;

//Cookie 和 Session 的区别
//• Cookie 是客⼾端保存⽤⼾信息的⼀种机制. Session 是服务器端保存⽤⼾信息的⼀种机制.
//• Cookie 和 Session之间主要是通过 SessionId 关联起来的, SessionId 是 Cookie 和 Session 之间的
//桥梁
//• Cookie 和 Session 经常会在⼀起配合使⽤. 但是不是必须配合.
//◦ 完全可以⽤ Cookie 来保存⼀些数据在客⼾端. 这些数据不⼀定是⽤⼾⾝份信息, 也不⼀定是
//SessionId
//◦ Session 中的sessionId 也不需要⾮得通过 Cookie/Set-Cookie 传递, ⽐如通过URL传递.

@RequestMapping("/session")
@RestController
public class SessionController {
//    获取Cookie
@RequestMapping("/getC")
    public String getCookie(HttpServletRequest request, HttpServletResponse response){
        //获取所有cookie信息
        Cookie[] cookies =  request.getCookies();
        //打印所有cookie
        StringBuilder stringBuilder = new StringBuilder();
        if(cookies != null){
            for (Cookie ck : cookies) {
                stringBuilder.append(ck.getName()+": "+ck.getValue());
            }
        }
        return stringBuilder.toString();
    }
    @RequestMapping("/getC1")
    public String getCookie1(HttpServletRequest request, HttpServletResponse response){
        //获取参数
//        String name = request.getParameter("name");
        Cookie[] cookies = request.getCookies();
        if (cookies!=null){
            //正则表达式
            Arrays.stream(cookies).forEach(ck -> System.out.println(ck.getName()+":"+ck.getValue()));
        }
        return "获取Cookie";
    }

    @RequestMapping("/getC2")
    public String getCookie2(@CookieValue("yzh")String co){
        return "cookie: "+co;
    }
    //若路径里没有yzh这个cookie值就会报400错
//    这段代码是一个 Spring MVC 中的 Controller 方法，
//    使用 @RequestMapping 注解将路径映射为"/getC2"。
//    方法名为 getCookie2，接收一个类型为 String 的参数，
//    通过 @CookieValue 注解指定该参数要从请求的 Cookie 中获取名为"yzh"的值。
//    最后返回一个字符串，内容为"cookie: "加上获取到的 Cookie 值"co"。在访问"/getC2"路径时，
//    将会获取名为"yzh"的 Cookie 值并返回给客户端。

    //Session是服务器端的机制, 我们需要先存储, 才能再获取
    @RequestMapping("/setSession")
    public String setSession(HttpServletRequest request, HttpServletResponse response){
    //从cookie中获取sessionID, 根据sessionID获取Session对象
        // 如果没有获取到, 会创建一个session对象
        HttpSession session = request.getSession();
        if (session != null) {
            session.setAttribute("name", "zhangsan");
        }
//  getSession 操作内部提取到请求中的Cookie里的SessionId, 然后根据SessionId获取到对应的Session对象
            return "设置session成功";
    }

    @RequestMapping("/getSession")
    public String getSession(HttpServletRequest request) {
//从cookie中获取到了sessionID, 根据session获取Session对象
        HttpSession session = request.getSession();
        String name = (String)session.getAttribute("name");
//Object getAttribute(String name):
// 返回在该 session 会话中具有指定名称的对象，如果没有指定名称的对象，则返回 null.
        return "从session中获取name:"+name;
    }
    // Http响应中, 通过Set-Cookie告知客⼾端, 把SessionID存储在Cookie中

    //简介取session
    @RequestMapping("/getSession1")
    public String getSession1(@SessionAttribute(value = "name", required = false) String name){
        return "从session中获取name:"+name;
    }

    //通过Spring MVC内置对象HttpSession 来获取
    @RequestMapping("/getSession3")
    public String getSession3(HttpSession session) {
        String username = (String)session.getAttribute("username");
        return "username："+username;
    }
//    HttpSession session = request.getSession();
//    Session 不存在的话, 会⾃动进⾏创建

    //获取Header也是从 HttpServletRequest 中获取
    @RequestMapping("/getHeader")
    public String getHeader(HttpServletRequest request){
        return request.getHeader("User-Agent");
    }
    @RequestMapping("/getHeader1")
    public String getHeader1(@RequestHeader("User-Agent") String UserAgent){
        return UserAgent;
    }
}
